home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et3_0-a1.lha / et3 / src / Metric.C < prev    next >
C/C++ Source or Header  |  1992-06-09  |  3KB  |  155 lines

  1. #ifdef __GNUG__
  2. #pragma implementation
  3. #endif
  4.  
  5. #include "Metric.h"
  6.  
  7. #include "Class.h"
  8. #include "String.h"
  9. #include "Math.h"
  10.  
  11. SimpleMetaImpl(Metric)
  12. {
  13.     len= len;
  14.     Metric *m= (Metric*) addr;
  15.     if (! isptr)
  16.     sprintf(buf, "w: %d  h: %d  b: %d", m->extent.x, m->extent.y, m->base);
  17. }
  18.  
  19. Metric::Metric()
  20. {
  21.     extent.x= extent.y= base= 0;
  22. }
  23.  
  24. Metric::Metric(Point e, int b)
  25. {
  26.     extent= e;
  27.     base= b;
  28. }
  29.  
  30. Metric::Metric(Point e)
  31. {
  32.     extent= e;
  33.     base= extent.y;
  34. }
  35.  
  36. Metric::Metric(int w)
  37. {
  38.     extent.x= extent.y= w;
  39.     base= w;
  40. }
  41.  
  42. Metric::Metric(int w, int h)
  43. {
  44.     extent.x= w;
  45.     base= extent.y= h;
  46. }
  47.     
  48. Metric::Metric(int w, int h, int b)
  49. {
  50.     extent.x= w;
  51.     extent.y= h;
  52.     base= b;
  53. }
  54.  
  55. Metric::Metric(const Metric &m)
  56. {
  57.     extent.x= m.extent.x;
  58.     extent.y= m.extent.y;
  59.     base= m.base;
  60. }
  61.  
  62. Metric Metric::Inset(Point e)
  63. {
  64.     extent-= 2*e;
  65.     base-= e.y;
  66.     return *this;
  67. }
  68.  
  69. Metric Metric::Expand(Point e)
  70. {
  71.     extent+= 2*e;
  72.     base+= e.y;
  73.     return *this;
  74. }
  75.  
  76. Metric Metric::Merge(const Metric &m)
  77. {
  78.     extent.x= Math::Max(extent.x, m.extent.x);
  79.     base= Math::Max(base, m.base);
  80.     int descender= Math::Max(extent.y-base, m.extent.y-m.base);
  81.     extent.y= base+descender;
  82.     return *this;
  83. }
  84.  
  85. Metric Metric::Cat(Direction d, const Metric &m, const Point &gap)
  86. {
  87.     if (d == eVert) {
  88.     extent.x= Math::Max(extent.x, m.extent.x);
  89.     extent.y+= m.extent.y + gap.y;
  90.     base= extent.y;
  91.     } else {        // eHor
  92.     base= Math::Max(base, m.base);
  93.     extent.x+= m.extent.x + gap.x;
  94.     extent.y= base+Math::Max(extent.y-base, m.extent.y-m.base);
  95.     }
  96.     return *this;
  97. }
  98.  
  99. Metric HCat(const Metric &m1, const Metric &m2, int hgap)
  100. {
  101.     Metric m;
  102.     m.base= Math::Max(m1.base, m2.base);
  103.     m.extent.x= m1.extent.x + m2.extent.x + hgap;
  104.     m.extent.y= m.base+Math::Max(m1.extent.y-m1.base, m2.extent.y-m2.base);
  105.     return m;
  106. }
  107.  
  108. Metric VCat(const Metric &m1, const Metric &m2, int vgap)
  109. {
  110.     Metric m;
  111.     m.extent.x= Math::Max(m1.extent.x, m2.extent.x);
  112.     m.base= m.extent.y= m1.extent.y + m2.extent.y + vgap;
  113.     // m.base= m.extent.y/2;
  114.     return m;
  115. }
  116.  
  117. Metric Cat(Direction d, const Metric &m1, const Metric &m2, Point gap)
  118. {
  119.     if (d == eVert)
  120.     return VCat(m1, m2, gap.y);
  121.     return HCat(m1, m2, gap.x);
  122. }
  123.  
  124. Metric Min(const Metric &m1, const Metric &m2)
  125. {
  126.     Metric m;
  127.     m.extent.x= Math::Min(m1.extent.x, m2.extent.x);
  128.     m.base= Math::Min(m1.base, m2.base);
  129.     int descender= Math::Min(m1.extent.y-m1.base, m2.extent.y-m2.base);
  130.     m.extent.y= descender+m.base;
  131.     return m;
  132. }
  133.  
  134. Metric Max(const Metric &m1, const Metric &m2)
  135. {
  136.     Metric m;
  137.     m.extent.x= Math::Max(m1.extent.x, m2.extent.x);
  138.     m.base= Math::Max(m1.base, m2.base);
  139.     int descender= Math::Max(m1.extent.y-m1.base, m2.extent.y-m2.base);
  140.     m.extent.y= descender+m.base;
  141.     return m;
  142. }     
  143.  
  144. OStream& operator<< (OStream &s, const Metric &m)
  145. {
  146.     return s << m.extent SP << m.base SP;
  147. }
  148.  
  149. IStream& operator>> (IStream &s, Metric &m)
  150. {
  151.     return s >> m.extent >> m.base;
  152. }
  153.  
  154.  
  155.